import sys
import pygame
import auxiliar
from matrix import *
from cell import *


BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
DOWN = False
CLEAR = False
cells = []

SIZE = 10

ESCALA = 25

def main():
    global cells, SIZE, CLEAR, ESCALA
    
    pygame.init
        
    filas = int(raw_input('Ingrese filas: '))
    columnas = int(raw_input('Ingrese columnas: '))
    matrix = Matrix(filas, columnas)
    
    screen = pygame.display.set_mode((columnas*SIZE, filas*SIZE))
    background = pygame.Surface(screen.get_size())
    background = background.convert()
    background.fill((0,0,200))
    background_rect = background.get_rect()
    
    # Matrix para hacer los calculos del automata celular
    
    if raw_input('Desea llenar la matrix random? (s/n) ')[0] == 's':
        auxiliar.fill_random(matrix, range(0,400,10))
    elif raw_input('Desea llenar la matrix random desde un archivo? (s/n) ')[0] == 's':
        auxiliar.read_from_file(matrix)
    else:
        auxiliar.initial_matrix(matrix)
    #print matrix
    
    # Matriz para guardar las celdas
    cells_matrix = []
    for i in range( 0, filas*SIZE, SIZE) :
        fila= []
        for j in range( 0, columnas*SIZE, SIZE):
            
            aux =Cell( pos=(j,i) )
            aux.set_color(matrix.get_total(i/SIZE,j/SIZE))
            
            fila.append(aux)
            cells.append(aux)
        cells_matrix.append(fila)
    
    grupo_cells = pygame.sprite.Group( cells )
    
    # Dibujo el fondo
    screen.blit(background, (0,0))
            
    # Dibujo a los agentes en mi screen
    grupo_cells.draw(screen)
    
    # Muestro screen actualizado
    pygame.display.flip()
    raw_input('Apriete')
    clock = pygame.time.Clock()
    fps = 30
    
    filename = raw_input('Ingrese archivo log: ')
    # Abro el archivo de log
    log = open(filename, 'r')
    
    time = 0
    end = False
    #count = 0
    while (not end):
        # Mantengo la actualizacion grafica a la velocidad deseada
        clock.tick(fps)
        
        # Llamo al manejador de eventos y obtengo posicion si se hizo click
        pos = event_handler()
        
        # Obtengo la celda donde se hizo click
        if len(pos) > 0:
            for aux in pos :
                matrix.update_cell(int(aux[1]/SIZE), int(aux[0]/SIZE), 300)
    
        # Itero por las lineas del archivo
        for line in log:
        
            if line.find(';') != -1:
                # Entonces no estoy en una linea de logeo de datos
                continue
        
            # Separo los datos (estan en tipo string aun)
            data = line.split(',')
            if float(data[0]) == time:
                # Agrego punto de presion en la posicion donde esta el agente
                matrix.update_cell(int(float(data[1])*ESCALA/SIZE), int(float(data[1])*ESCALA/SIZE), 200)
            else:
                time += 1
                break
        #auxiliar.update_pressure(matrix)
        matrix.update_pressure()
        
        for i in range(1, filas+1):
            for j in range(1, columnas+1):
                if CLEAR:
                    matrix.update_cell(i, j, 0)
                (cells_matrix[i-1][j-1]).set_color(matrix.get_value(i,j))
        
        CLEAR = False
        # Dibujo el fondo
        screen.blit(background, (0,0))
            
        # Dibujo a los agentes en mi screen
        grupo_cells.draw(screen)
    
        # Muestro screen actualizado
        pygame.display.flip()
        #count += 1
        
        #if count == 150:
        #    count = 0 
        #    end = raw_input('Salir? (s/n) ')[0] == 's'


def event_handler():
    global DOWN, CLEAR
    LEFT = 1
    RIGHT = 3
    ret = []
    
    for event in pygame.event.get():
        
        if event.type == pygame.QUIT:
            sys.exit(0)
        elif event.type == pygame.MOUSEBUTTONDOWN and event.button == LEFT:
            DOWN = True
            ret.append(event.pos)
        elif event.type == pygame.MOUSEBUTTONUP:
            DOWN = False
        #        event = pygame.event.poll()
        elif event.type == pygame.MOUSEMOTION and DOWN:
            ret.append(event.pos)
        elif event.type == pygame.MOUSEBUTTONDOWN and event.button == RIGHT:
            CLEAR = True
    
    return ret
 
if __name__ == "__main__":
    main()

    
